package com.xcw.test.caozuo;

/**
 * @author bhx
 * @Class P1_
 * @date 2022/11/13 1:16
 * @Description TODO
 */

import java.util.Scanner;

/**
 * 有N堆纸牌，编号分别为1，2，...,N。每堆上有若干张，
 * 但纸牌总数必为N的倍数。可以在任一堆上取若干张纸牌，然后移动。
 *
 * 移牌规则为:在编号为1堆上取的纸牌，只能移到编号为2的堆上;
 * 在编号为N的堆上取的纸牌，只能移到编号为N-1的堆上;
 *
 * 其他堆上取的纸牌，可以移到相邻左边或右边的堆上。
 * 现在要求找出一种移动方法，用最少的移动次数使每堆上纸牌数都一样多。
 * 例如N=4，4 堆纸牌数分别为:9 ②8 317④6移动3次可达到目的:
 * 从③取4张牌放到④ (9 8 13 10) ->从③取3张牌放到②(9 11 10 10)->
 * 从②取1张牌放到(10 10 10 10)。(1）本题分值:50分(2)考核时间:90min
 * (3）考核形式:上机实操
 * (4)编程语言:C/C++、Python、Java任选一种语言
 * (5）输入:N(N堆纸牌，1<=N<= 100) A1 A2 ...An (N堆纸牌，每堆纸牌初始数，l<= Ai <=10000)
 * (6)输出:所有堆均达到相等时的最少移动次数。
 * (7)样例输入: 4
 */
public class P6_ {
    public static void main(String[] args) {
        int sum = 0;
        int n = 0;
        int [] num = null;
        do {
            sum = 0;
            System.out.println("请输入纸牌的堆数：");
            Scanner sc = new Scanner(System.in);
            n = sc.nextInt();
            num = new int [n];
            System.out.println("请输入每一堆的数量：");

            for (int i = 0; i < n; i++) {
                int data = sc.nextInt();
                sum += data;
                num[i] = data;
            }
            if (sum%n != 0){
                System.out.println("纸牌总数必为堆数的倍数！请重新输入！");
            }
        }while (sum%n != 0);
        System.out.println(moveCards(num));

    }

    public static int moveCards(int[] groups) {

        int count = 0;
        int sum = 0;

        for (int i = 0; i < groups.length; i++) {

            sum += groups[i];

        }
        int average = sum / groups.length;

        for (int i = 0; i < groups.length-1; i++) {
            // 当 不管大于或者小于平均数均需要移动  大于 传递正数  小于传递负数
            if (groups[i] == average) {

                continue;

            } else {

                groups[i + 1] += groups[i] - average;

                count++;

            }

        }

        return count;
    }
}
